Projekt Pronal Projekt Pronal

Kazalo:
Sofinasiranje projekta
Starejši - učbenik...
Tekmovanja...
Tekmovanja - dopolni...
Tekmovanja - Parsons...
Tekmovanja - popravi...
Starejši - zbirka nalog
Funkcije
If stavek
Izpisi
Množice
Nizi
Pisanje in popravljanje programa
Seznami in nizi
Slovarji
Spoznajmo Python
Uvod v funkcije
Zanka for
Zanka while
Zanka for

Zanka for


Vsote

1. podnaloga

Sestavite funkcijo vsota_kvadratov(n), ki izračuna in vrne vsoto kvadratov števil od $1$ do $n$: $1^2 + 2^2 + 3^2 + \ldots + n^2$. Primer:

>>> vsota_kvadratov(10)
385

Uradna rešitev

def vsota_kvadratov(n):
    '''Vsota kvadratov števil od 1 do n'''
    s = 0
    for i in range(1, n + 1): # začnemo pri 1 in končamo pri n
        s += i * i
    return s

2. podnaloga

Sestavite funkcijo vsota(n), ki izračuna in vrne vsoto $1\cdot2 + 2\cdot3 + 3\cdot4 + \ldots + n\cdot(n+1)$. Primer:

>>> vsota(10)
440

Uradna rešitev

def vsota(n):
    '''Vsota produktov števil in njihovih naslednikov, vse do števila n'''
    s = 0
    for i in range(1, n + 1): # začnemo pri 1 in končamo pri n
        s += i * (i + 1)
    return s

Fakulteta

1. podnaloga

Fakulteta (!) je matematična operacija kjer $n!$ izračuna zmnožek vseh naravnih števil od 1 do vklučno n. Naprimer $3!$ je enako izrazu $1*2*3$. $0!$ je enaka 1.

Sestavite funkcijo fakulteta(n), ki vrne število $n!$. Na primer:

>>> fakulteta(4)
24
>>> fakulteta(1)
1

Uradna rešitev

def fakulteta(n):
    '''vrne število n!'''
    zmnožek = 1
    for st in range(1, n + 1):
        zmnožek *= st
    return zmnožek

2. podnaloga

Napišite funkcijo fakulteta2(n), kjer začetno število množimo z lihimi števili in delimo s sodimi. Delitelji in množitelji so naravna števila do vklučno n. Začetno število je 1. Tako je naprimer fakulteta2(5) enaka izrazu $1/2*3/4*5$. fakulteta2(0) je enaka 1.

Na primer:

>>> fakulteta2(0)
1
>>> fakulteta2(3)
1.5

Uradna rešitev

def fakulteta2(n):
    '''vrne izraz, ki ga dobimo, če začetno število delimo s sodimi števili in množimo z
    lihimi'''
    rezultat = 1
    for st in range(1, n + 1, 2):
        rezultat *= st
        if st + 1 <= n:
            rezultat /= (st + 1)
    return rezultat

3. podnaloga

Napišite funkcijo sestevek(n), ki sešteje fakultete od 0 do vklučno n.

>>> sestevek(3)
10

Uradna rešitev

def sestevek(n):
    '''sešteje fakultete od 0 do vključno n'''
    sest = 0
    for st in range (0, n + 1):
        sest += fakulteta(st)
    return sest

Pivska igra na 3

1. podnaloga

Strašni gusarji pod poveljstvom strašnega kapitana Kljuke, se v obdobjih mirnega morja kratkočasijo s pitjem ruma. Ker je morje večino časa mirno, so si izmislili naslednjo igro. Sedijo v krogu na palubi in zaporedoma izgovarjajo zaporedne številke, le da namesto vseh večkratnikov števila tri rečejo bum. Kdor se zmoti, za kazen pije.

Napišite program, ki izpiše števila od 1 do vključno 40, tako da namesto večkratnikov števila 3 izpiše bum. Primer:

1
2
bum
4
...

in tako naprej vse do

...
38
bum
40

Uradna rešitev

for i in range(1,41):
    if i % 3 == 0:   #ostanek pri deljenju s 3 je 0
        print('bum')
    else:
        print(i)

2. podnaloga

Ker jim je prejšnja igra postala že preveč monotona, so si gusarji izmislili še dodatno pravilo, da rečejo bum tudi namesto tistih številk, ki vsebujejo trojko.

Primer:

 ...
 10
 11
 bum
 bum
 14
 bum
 ...

Preoblikujte prejšnji program tako, da bo upošteval tudi novo pravilo, za števila od 1 do vključno 40.

Uradna rešitev

for i in range(1,41):
    if i % 3 == 0 or i % 10 == 3 or i // 10 == 3: # vemo, da je i eno ali dvomestno število!
        print('bum')
    else:
        print(i)

3. podnaloga

Zakaj bi vedno začeli z 1, so se nekega dne vprašali gusarji in tako je kapitan Kljuka, ki je seveda vedno začel igro, začenjal igro s poljubno številko.

Napišite program ki najprej vpraša po mejah a in b in po pravilih igre izpisuje števila med a in b. Če velja $b < a$, se seveda ne bo izpisalo nič!

Povejmo, da lahko preverimo vsebovanost 'x' v nekem nizu z izrazom:

 'x' in niz

Primer:

 Vnesi začetek: 20
 Vnesi konec: 25
 20
 bum
 22
 bum
 bum
 25

Uradna rešitev

zac = int(input("Vnesi začetek: "))
kon = int(input("Vnesi konec: "))
for i in range(zac, kon + 1):
    if i % 3 == 0 or '3' in str(i): #število spremenimo v niz in pogledamo
                                    #če vsebuje znak 3
        print('bum')
    else:
        print(i)

Črka v nizu

1. podnaloga

Z zanko for se lahko, kot smo že omenili, sprehajamo tudi po črkah niza.

Sestavite funkcijo kje_stoji_prvic(znak, niz), ki vrne indeks prvega mesta, katerem dani znak stoji v nizu. Če takega znaka ni v nizu vrnemo -1. Upoštevajte, da ima prvi znak indeks 0, drugi indeks 1 itd.

Na primer:

>>> kje_stoji_prvic('a', 'beseda')
5
>>> kje_stoji_prvic('!', Ali si ok?)
-1
>>> kje_stoji_prvic('A', 'Ljubljana')
-1

Uradna rešitev

def kje_stoji_prvic(znak, niz):
    '''Vrne indeks prve pojavitve znaka v nizu'''
    mesto = 0
    for zn in niz:
        if zn == znak:
            break
        mesto += 1
    else:
        mesto = -1
    return mesto

2. podnaloga

Sestavite funkcijo kje_stoji_zadnjic(znak, niz), ki vrne zadnji indeks, na katerem stoji dani znak v nizu. Če takega znaka ni v nizu vrnemo -1. Upoštevajte, da ima prvi znak indeks 0, drugi indeks 1 itd. Na primer:

>>> kje_stoji_zadnjic('a', 'beseda')
5
>>> kje_stoji_zadnjic('!', Ali si ok?)
-1
>>> kje_stoji_zadnjic('a', 'Ljubljana')
8

Uradna rešitev

def kje_stoji_zadnjic(znak, niz):
    '''Vrne indeks prve pojavitve znaka v nizu'''
    mesto = 0
    kje = -1
    for zn in niz:
        if zn == znak:
            kje = mesto
        mesto += 1
    return kje

3. podnaloga

Napišite funkcijo kolikokrat(znak, niz), ki vrne število pojavitev danega znaka v danem nizu.

>>> kolikokrat('a', 'ljubljana')
2
>>> kolikokrat('o', 'otorinolaringolog')
5

Uradna rešitev

def kolikokrat(znak, niz):
    '''vrne število pojavitev znaka v nizu'''
    stPojavitev = 0
    for zn in niz:
        if zn == znak:
            stPojavitev += 1
    return stPojavitev

Naključje

1. podnaloga

Baltazar rad igra bingo, vendar je to posebna vrsta te igre, saj se lahko vse številke večkrat ponovijo. Ker pa se je Baltazar med igro dolgočasil se je odločil, da bo računal povprečje vseh števil.

Pomagajte Baltazarju in napišite funkcijo bingo_povprecje(), ki simulira izbor 25 celih števil med vključno 1 in vključno 100 pri igri (s pomočjo knjižnice random) in vrne povprečje vseh 25 števil.

Uradna rešitev

import random
def bingo_povprecje():
    '''Simulira žreb 25 števil med 1 in 100 ter vrne povprečje'''
    sestevek = 0
    for i in range(25):
        st = random.randint(1, 100)
        sestevek += st
    povprecje = sestevek / 25
    return povprecje

2. podnaloga

Vendar pa se je Baltazar kmalu spet začel dolgočasiti. Zato se je odločil, da napiše še funkcijo, ki bo vračala seštevek najmanjšega in največjega elementa.

Pomagajte Baltazarju in napišite funkcijo bingo_min_max(), ki simulira izbor 25 celih števil med vključno 1 in vključno 100 pri igri (s pomočjo knjižnice random) in vrne seštevek najmanjšega in največjega števila.

Uradna rešitev

import random
def bingo_min_max():
    '''Simulira žreb 25 števil med 1 in 100 ter vrne seštevek najmanjšega in
    največjega števila'''
    minimum = 101
    maksimum = 0
    for i in range(25):
        st = random.randint(1, 100)
        if st > maksimum:
            maksimum = st
        if st < minimum:
            minimum = st
    sestevek = minimum + maksimum
    return sestevek

3. podnaloga

Baltazar se je tako dolgočasil, da je izumil svoj bingo. Pri njegovi igri se izžreba eno število in vsak ima 5 poskusov, da ga ugotovi.

Pomagajte Baltazarju in napišite funkcijo bingo_baltazar(), ki simulira izbor 25 celih števil med vključno 1 in vključno 100 pri igri (s pomočjo knjižnice random) in za vsako število še izbor 5 celih števil ter vrne število pravih ugotovitev za vseh 25 števil. Udeleženec lahko večkrat poskusi z istim številom.

Uradna rešitev

import random
def bingo_baltazar():
    '''Simulira žreb 25 števil med 1 in 100 ter vrne število pravilnih ugibanj'''
    pravilno = 0
    for i in range(25):
        st = random.randint(1, 100)
        for poskus in range(5):
            ugiba = random.randint(1, 100)
            if ugiba == st:
                pravilno += 1
    return pravilno
Mesto objave ob koncu projekta 15.9.2018